/**
 * 剩余或用时计算
 * @param ms int 毫秒数
 * @param opt json|null 格式化
 * 		pre: boolean 是否补完  true:大于ms单位保留  默认:false
 * 		pad: boolean 是否补到2或3位: 时,分,秒,毫秒  默认:false
 * 		fmt: array|boolean 格式化  默认true=>等同:[d,h,m,s,ms]
 * 			false:不格式化,返回json,  array:单位->[d,h,m,s,ms]
 * @return object|string  当opt.fmt时: string,格式化字符串
 * 		!opt.fmt: {d,h,m,s,ms},  !opt.pre大于ms单位值:null
 */
$.dateUse = function(ms, opt=null){
	const F=['d','h','m','s','ms'], M={h:2,m:2,s:2,ms:3};
	$.dateUse = function(ms, opt=null){
		let x=opt?.pre?0:null, v={d:x,h:x,m:x,s:x};
		v.ms=ms%1E3;  ms=Math.floor(ms/1E3);
		if(ms>0){ v.s=ms%60; ms=Math.floor(ms/60); }
		if(ms>0){ v.m=ms%60; ms=Math.floor(ms/60); }
		if(ms>0){ v.h=ms%24; ms=Math.floor(ms/24); }
		if(ms>0) v.d=ms; let fmt=opt?.['fmt']??true;
		opt?.pad && Object.keys(M).forEach(k=>{
			if(v[k]!==null) v[k] = $.pad(v[k],M[k]);
		});
		if(!fmt) return v; if(fmt===true) fmt=F; let R='';
		let B = (k,i)=>{ if(v[k]!==null)R+=v[k]+fmt[i]; };
		F.forEach(B);  return R;
	};
	return $.dateUse(ms, opt);
};
